package gretha.donnees;

import gretha.utils.ConnecteurBDD;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class Cohorte {
	private String nom;

	private ArrayList<Arbre> arbres;

	private ArrayList<Modification> modifications;

	private ArrayList<Prelevement> prelevements;

	public Cohorte() {
		nom = "";
		arbres = new ArrayList<Arbre>();
		modifications = new ArrayList<Modification>();
		prelevements = new ArrayList<Prelevement>();
	}

	public Cohorte(String nom) {
		this.nom = nom;
		arbres = new ArrayList<Arbre>();
		modifications = new ArrayList<Modification>();
		prelevements = new ArrayList<Prelevement>();
	}

	public Cohorte(String nom, ArrayList<Arbre> arbre, ArrayList<Modification> modification,ArrayList<Prelevement> p) {
		this.nom = nom;
		arbres= arbre;
		modifications = modification;
		prelevements = p;
	}


	public void sauvegarderEnBase()
	{
		//On enregistre la cohorte et on recupere son ID 
		insererCohorteEnBase();
		int idCohorte = getId();

		//On ajoute l'arbre en base et on enregistre son ID
		this.arbres.get(0).enregistrerDansLaBDD();
		int idArbre = this.arbres.get(0).getId();

		//On assigne l'arbre à la cohorte
		try {
			ConnecteurBDD.executeUpdate("Insert into contenancecohorte(idCohorte,idArbre) Values ("+idCohorte+","+idArbre+")");
		} catch (SQLException e) {
			e.printStackTrace();
		}

		//On ajoute les modifications
		insererModificationsEnBase(idCohorte);

		//On ajoute les prelevements
		insererPrelevementsEnBase(idCohorte);

	}

	public void insererCohorteEnBase()
	{
		boolean existe = false;
		try {
			ResultSet rs = ConnecteurBDD.executeQuery("SELECT idCohorte from cohortes WHERE nom='"+nom+"'");
			rs.next();
			if(!(rs.getInt(1) > 0))
			{	
				existe = true;
			}
		} catch (SQLException e) {
			System.err.println("La cohorte "+nom+" n'existe pas");
		}
		if(!existe)
		{
			try {
				ConnecteurBDD.executeUpdate("INSERT INTO cohortes (nom) VALUES ('"+nom+"')");
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public Modification modificationEnAnnee(int annee, int idCohorte)
	{
		Modification retour = new Modification();
		int idModification = -1;
		try {
			ResultSet rs = ConnecteurBDD.executeQuery("SELECT * FROM modifications	WHERE idCohorte = "+ idCohorte +" AND annee="+annee);
			rs.next();
			if(rs.getInt(1) > 0)
			{	
				idModification = rs.getInt(1);
			}
		} catch (SQLException e) {
			//System.err.println("La modification en année "+annee+" n'existe pas");
		}
		if(idModification > 0)
		{
			retour.recupererDonnees(idModification);
		}

		return retour;

	}

	public Prelevement prelevementEnAnnee(int annee, int idCohorte)
	{
		Prelevement retour = new Prelevement();
		int idPrelevement = -1;
		try {
			ResultSet rs = ConnecteurBDD.executeQuery("SELECT * FROM prelevements	WHERE idCohorte = "+ idCohorte +" AND annee="+annee);
			rs.next();
			if(rs.getInt(1) > 0)
			{	
				idPrelevement = rs.getInt(1);
			}
		} catch (SQLException e) {
			//System.err.println("Le prelevement en année "+annee+" n'existe pas");
		}
		if(idPrelevement > 0)
		{
			retour.recupererDonnees(idPrelevement);
		}
		else
		{
			retour = null;
		}

		return retour;

	}

	
	public int anneeDeDebut()
	{
		int anneeDebut = 10000;

		for(Modification m : modifications)
		{
			if(anneeDebut > m.getAnnee())
			{
				anneeDebut = m.getAnnee();
			}
		}

		return anneeDebut;
	}

	public int anneeDeFin()
	{
		int anneeFin = -10;	

		for(Modification m : modifications)
		{
			if(anneeFin < m.getAnnee())
			{
				anneeFin = m.getAnnee();
			}
		}

		return anneeFin;
	}



	public void insererModificationsEnBase(int idCohorte)
	{
		for(Modification m : modifications)
		{
			m.sauvegarderEnBase(idCohorte);
		}
	}

	public void insererPrelevementsEnBase(int idCohorte)
	{
		for(Prelevement p : prelevements)
		{
			p.sauvegarderEnBase(idCohorte);
		}
	}
	

	public int getId()
	{
		int retour = -1;
		try {
			ResultSet rs = ConnecteurBDD.executeQuery("SELECT idCohorte from cohortes WHERE nom='"+nom+"'");
			rs.next();
			retour = rs.getInt(1);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return retour;
	}

	public void recupererDonnees(int idCohorteSelectionne) {
		//Recuperation du nom
		try {
			ResultSet rs = ConnecteurBDD.executeQuery("SELECT nom from cohortes where idCohorte ="+idCohorteSelectionne);
			rs.next();
			setNom(rs.getString(1));
		} catch (SQLException e) {
			e.printStackTrace();
		}	

		//Recuperation de l'arbre
		try {
			ResultSet rs = ConnecteurBDD.executeQuery("SELECT arbres.idArbre,arbres.nom from arbres INNER JOIN contenancecohorte ON arbres.idArbre = contenancecohorte.idArbre WHERE contenancecohorte.idCohorte ="+idCohorteSelectionne);
			rs.next();
			ArrayList<Arbre> arbresTmp = new ArrayList<Arbre>();
			arbresTmp.add(new Arbre(rs.getString(2)));
			setArbres(arbresTmp);
		} catch (SQLException e) {
			e.printStackTrace();
		}		
		//Recuperation des modifications
		try {
			ResultSet rs = ConnecteurBDD.executeQuery("SELECT * from modifications WHERE idCohorte ="+idCohorteSelectionne);
			ArrayList<Modification> modificationsTmp = new ArrayList<Modification>();
			while(rs.next())
			{
				modificationsTmp.add(new Modification(rs.getInt(3),rs.getDouble(4),rs.getDouble(5)));
			}
			setModifications(modificationsTmp);
		} catch (SQLException e) {
			e.printStackTrace();
		}		
		//Recuperation des prelevements
		try {
			ResultSet rs = ConnecteurBDD.executeQuery("SELECT * from prelevements WHERE idCohorte ="+idCohorteSelectionne);
			ArrayList<Prelevement> prelevementsTmp = new ArrayList<Prelevement>();
			while(rs.next())
			{
				prelevementsTmp.add(new Prelevement(rs.getDouble(4),rs.getDouble(6),rs.getDouble(5),rs.getInt(3)));
			}
			setPrelevements(prelevementsTmp);
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	}
	
	public static void supprimerCohorteEnBase(int idCohorte)
	{
		try {
			ConnecteurBDD.executeUpdate("DELETE FROM cohortes WHERE idCohorte = "+idCohorte);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/*
	 * 			GET and SET
	 */


	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}

	public ArrayList<Arbre> getArbres() {
		return arbres;
	}

	public void setArbres(ArrayList<Arbre> arbres) {
		this.arbres = arbres;
	}

	public ArrayList<Modification> getModifications() {
		return modifications;
	}

	public void setModifications(ArrayList<Modification> modifications) {
		this.modifications = modifications;
	}

	public ArrayList<Prelevement> getPrelevements() {
		return prelevements;
	}

	public void setPrelevements(ArrayList<Prelevement> prelevements) {
		this.prelevements = prelevements;
	}



}
